.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\comdlg32.inc include \masm32\include\user32.inc include \MASM32\INCLUDE\shell32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\comdlg32.lib includelib \MASM32\LIB\shell32.lib include \masm32\include\advapi32.inc includelib \masm32\lib\advapi32.lib include \masm32\include\comctl32.inc includelib \masm32\lib\comctl32.lib WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD SectionPiti PROTO OuvrirFichier PROTO :DWORD EcrireDonnees PROTO :DWORD RVAToFileMap PROTO :DWORD,:DWORD RVAToOffset PROTO :DWORD,:DWORD DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD NouvellesFonctions PROTO :DWORD, :DWORD DlgProc2 PROTO :DWORD,:DWORD,:DWORD,:DWORD DlgProcLV2 PROTO :DWORD,:DWORD,:DWORD,:DWORD lcase PROTO :DWORD Deci2Char PROTO :DWORD SEH struct PrevLink dd ? ; adresse de la structure SEH ci-dessus CurrentHandler dd ? ; adresse du 'exception handler' SafeOffset dd ? ; endroit où est sauvegardé l'offset pour continuer l'exécution PrevEsp dd ? ; l'ancienne valeur dans 'esp' PrevEbp dd ? ; ancienne valeur dans 'ebp' SEH ends .data AppName db "Before the Reverse",0 ClassName db "SimpleWinClass",0 MenuName db "FirstMenu",0 ; Le nom de notre menu dans le fichier de ressources. MenuName2 db "FirstMenu2",0 ofn OPENFILENAME <> ofnDLL OPENFILENAME <> FilterString db "Fichiers Executables (*.exe, *.dll)",0,"*.exe;*.dll",0 db "All Files",0,"*.*",0,0 FileOpenError db "Impossible d'ouvrir le fichier pour le lire",0 FileOpenMappingError db "Impossible d'ouvrir le fichier pour le mapper en mémoire",0 FileMappingError db "Le fichier n'a pas pu être mappé en mémoire",0 FileValidPE db "Fichier de type PE valide",0 FileInValidPE db "Ceci n'est pas un fichier PE valide",0 Copie db "_Sauvegarde.exe",0 Info db "Ce programme rajoute les trois fonctions suivantes:",0Ah,0Dh db " ",0Ah,0Dh db "- GetModuleHandleA",0Ah,0Dh db "- GetProcAdress",0Ah,0Dh db "- LoadLibraryA",0Ah,0Dh db " ",0Ah,0Dh db "Ces trois fonctions sont suffisantes pour appeler",0Ah,0Dh db "n'importe quelles autres. Cependant, vous pouvez",0Ah,0Dh db "aussi en rajouter de nouvelles, directement en les",0Ah,0Dh db "plaçant dans le fichier AddFunc.ini",0Ah,0Dh db " ",0Ah,0Dh db " ",0Ah,0Dh db "Voulez-vous créer le fichier AddFunc.ini",0 InfoA db "This program add the three following functions :",0Ah,0Dh db " ",0Ah,0Dh db "- GetModuleHandleA",0Ah,0Dh db "- GetProcAdress",0Ah,0Dh db "- LoadLibraryA",0Ah,0Dh db " ",0Ah,0Dh db "This three functions are enough to call anyone",0Ah,0Dh db "other. Nevertheless, you can also add more",0Ah,0Dh db "others, straight only put them into the",0Ah,0Dh db "AddFunc.ini file",0Ah,0Dh db " ",0Ah,0Dh db " ",0Ah,0Dh db "Do you want create the AddFunc.ini file",0 Createur db "Programme écrit sous Masm6.0",0Dh,0Ah db " ",0Dh,0Ah db " -[Morgatte]-",0 CreateurA db "Program written with Masm6.0",0Dh,0Ah db " ",0Dh,0Ah db " -[French Coder : Morgatte]-",0 ClassNameListView db "ListViewWinClass",0 ListViewClassName db "SysListView32",0 Heading1 db "Fonction",0 Heading1A db "Function",0 Heading2 db "Call dword ptr [........]",0 Heading3 db "Module",0 FileNameSortOrder dd 0 SizeSortOrder dd 0 TestString db "Hello, everybody",0 hwndDlg dd 0 ; Handle to the dialog box DlgName db "MyDialog",0 DlgNameA db "MyDialogA",0 hwndDlg2 dd 0 ; Handle to the dialog box de recherche DlgName2 db "Recherche",0 DlgName2A db "Search",0 hwndDlgLV2 dd 0 DlgNameLV2 db "RechercheListView",0 DlgNameLV2A db "RechercheListViewA",0 formatHexa db "%lx",0 formatDeci db "%li",0 formatChar db "%s",0 Texte db "valeur = %lxh",0 ; wsprintf erreur db "<-->",0 slBouton db "BUTTON",0 szMsg db "Rien",0 etoile db "*",0 ProgressClass db "msctls_progress32",0 Loader db "Loader injecté !!",0 LoaderA db "Loader injected !!",0 .data? hInstance HINSTANCE ? CommandLine LPSTR ? HWNDParent HANDLE ? hFichier HANDLE ? hMenu HANDLE ? hIcon HANDLE ? buffer db 512 dup(?) Buffer db 50 dup (?) ; sert à la fonction wsprintf NomProgramme db 512 dup(?) hFile dd ? hMapping dd ? pMapping dd ? ValidPE dd ? nombreHChar db 09 dup (?) CheminFichier db 100 dup (?) NumberOfSections dd ? ImageBase dd ? AddressOfEntryPoint dd ? SectionAlignment dd ? FileAlignment dd ? VirtualAddress dd ? PointerToRawData dd ? VirtualSize dd ? SizeOfRawData dd ? hList dd ? hMenuListView dd ? BufferDLL db 50 dup (?) BufferFonction db 50 dup (?) hEdit HANDLE ? hwndProgress dd ? langage dd ? ; 40Ch = Francais NomM db 20 dup (?) .const IDI_ICON equ 500 ; n°ID de l'Icône IDM_TEST equ 1 ; (Menu IDs) ou: Les n°Identification des éléments constituants le Menu IDM_OUVRIR equ 2 IDM_INFO equ 6 IDM_RCH1 equ 7 IDM_ICON equ LVS_ICON IDM_SMALLICON equ LVS_SMALLICON IDM_LIST equ LVS_LIST IDM_REPORT equ LVS_REPORT ID_BOUTON equ 85 IDC_EDIT equ 3000 IDC_BUTTON equ 3001 IDC_EXIT equ 3002 IDM_RCHLISTVIEW2 equ 3004 IDC_PROGRESS equ 3005 IDC_DLL equ 3006 .code include modules\miniproc.inc start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax invoke InitCommonControls WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND invoke GetUserDefaultLangID mov langage, eax ; 40Ch = Français and langage, 0000FFFFh invoke LoadIcon,hInst,IDI_ICON mov hIcon, eax mov wc.hIcon, eax mov wc.hIconSm,eax mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+10 mov wc.lpszMenuName,OFFSET MenuName ; Place le nom de notre menu ici mov wc.lpszClassName,OFFSET ClassName .if langage != 40Ch mov wc.lpszMenuName,OFFSET MenuName2 ; Place le nom de notre menu ici .endif invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES, \ ADDR ClassName, ADDR AppName,\ WS_OVERLAPPED or WS_SYSMENU, \ ; WS_TILEDWINDOW+ 250,100,306,60, \ NULL,NULL, \ hInst,NULL mov hwnd,eax mov HWNDParent, eax invoke GetMenu, eax mov hMenu, eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd invoke GetCurrentDirectory, sizeof CheminFichier, addr CheminFichier .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) .if hwndDlg!=0 || hwndDlg2!=0 invoke IsDialogMessage,hwndDlg,ADDR msg .if eax==TRUE .continue .endif invoke IsDialogMessage,hwndDlg2,ADDR msg .if eax==TRUE .continue .endif .endif INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL rect:RECT .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_COMMAND mov eax,wParam .IF ax==IDM_TEST .if langage != 40Ch invoke CreateDialogParam,hInstance, addr DlgNameA,hWnd,OFFSET DlgProc,NULL ; ListView1 .else invoke CreateDialogParam,hInstance, addr DlgName,hWnd,OFFSET DlgProc,NULL ; ListView1 .endif mov hwndDlg,eax ; invoke SendMessage, hwndDlg, WM_MOVE, 0, 0 invoke SendMessage, hwndDlg2, WM_CLOSE, NULL, NULL invoke SendMessage, hwndDlgLV2, WM_CLOSE, NULL, NULL .ELSEIF ax==IDM_OUVRIR invoke OuvrirFichier,hWnd ;***************************************** .ELSEIF ax==IDM_INFO .if langage != 40Ch invoke MessageBox, 0, addr InfoA, addr AppName, 44h .else invoke MessageBox, 0, addr Info, addr AppName, 44h .endif cmp eax, 6 jne non call FichierAddFunc non: .ELSEIF ax==ID_BOUTON .if langage != 40Ch invoke MessageBox, 0, addr CreateurA, addr AppName, 0 .else invoke MessageBox, 0, addr Createur, addr AppName, 0 .endif .ELSEIF ax==IDM_RCH1 .if langage != 40Ch invoke CreateDialogParam,hInstance, addr DlgName2A,hWnd,OFFSET DlgProc2,NULL ; Dial Recherche .else invoke CreateDialogParam,hInstance, addr DlgName2,hWnd,OFFSET DlgProc2,NULL ; Dial Recherche .endif mov hwndDlg2,eax ; invoke SendMessage, eax, WM_MOVE, 10, 10 invoke SendMessage, hwndDlg, WM_CLOSE, NULL, NULL invoke SendMessage, hwndDlgLV2, WM_CLOSE, NULL, NULL .ELSEIF ax==IDM_RCHLISTVIEW2 .if langage != 40Ch invoke CreateDialogParam,hInstance, addr DlgNameLV2A,hWnd,OFFSET DlgProcLV2,NULL ; ListView2 Rech .else invoke CreateDialogParam,hInstance, addr DlgNameLV2,hWnd,OFFSET DlgProcLV2,NULL ; ListView2 Rech .endif mov hwndDlgLV2,eax ; invoke SendMessage, hwndDlgLV2, WM_MOVE, 0, 0 invoke SendMessage, hwndDlg, WM_CLOSE, NULL, NULL invoke SendMessage, hwndDlg2, WM_CLOSE, NULL, NULL .ELSE invoke DestroyWindow,hWnd .ENDIF .ELSEIF uMsg==WM_CREATE invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slBouton,addr szMsg,\ WS_VISIBLE or WS_CHILDWINDOW or \ ES_AUTOHSCROLL or ES_NOHIDESEL,\ 0,0,300,17,hWnd,ID_BOUTON,hInstance,NULL .ELSEIF uMsg==WM_MOVE invoke GetWindowRect, hwndDlg, addr rect mov ecx, rect.right ; ecx = sub ecx, rect.left ; Largeur de la fenêtre ListView push ecx mov ebx, rect.bottom ; ebx = sub ebx, rect.top ; Hauteur de la fenêtre ListView invoke GetWindowRect, HWNDParent, addr rect pop ecx invoke MoveWindow, hwndDlg, rect.left,rect.bottom,ecx, ebx, TRUE ;-- idem pour la DialoBox de recherche -- invoke GetWindowRect, hwndDlg2, addr rect mov ecx, rect.right ; ecx = sub ecx, rect.left ; Largeur de la fenêtre De Recherche push ecx mov ebx, rect.bottom ; ebx = sub ebx, rect.top ; Hauteur de la fenêtre De Recherche invoke GetWindowRect, HWNDParent, addr rect pop ecx invoke MoveWindow, hwndDlg2, rect.left,rect.bottom,ecx, ebx, TRUE ;-- idem pour la ListBox de recherche -- invoke GetWindowRect, hwndDlgLV2, addr rect mov ecx, rect.right ; ecx = sub ecx, rect.left ; Largeur de la fenêtre De Recherche push ecx mov ebx, rect.bottom ; ebx = sub ebx, rect.top ; Hauteur de la fenêtre De Recherche invoke GetWindowRect, HWNDParent, addr rect pop ecx invoke MoveWindow, hwndDlgLV2, rect.left,rect.bottom,ecx, ebx, TRUE ;.ELSEIF uMsg==WM_CLOSE ; invoke EndDialog,hWnd,NULL ; mov hwndDlg,0 .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp OuvrirFichier proc uses edi hDlg:DWORD LOCAL seh:SEH mov ofn.lStructSize,SIZEOF ofn mov ofn.lpstrFilter, OFFSET FilterString ;mov ofn.lpstrFile, OFFSET buffer mov ofn.lpstrFile, OFFSET NomProgramme mov ofn.nMaxFile,512 mov ofn.Flags, OFN_FILEMUSTEXIST or \ OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ OFN_EXPLORER or OFN_HIDEREADONLY invoke GetOpenFileName, ADDR ofn .if eax==TRUE invoke CopyFile, addr NomProgramme, offset Copie, FALSE ;invoke lstrcpy, addr NomProgramme, addr buffer ;invoke CreateFile, addr buffer, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL invoke CreateFile, addr NomProgramme, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL .if eax!=INVALID_HANDLE_VALUE mov hFile, eax ;invoke lstrcpy, addr NomProgramme, addr buffer invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE,0,0,0 .if eax!=NULL mov hMapping, eax invoke MapViewOfFile,hMapping,FILE_MAP_WRITE,0,0,0 .if eax!=NULL mov pMapping,eax assume fs:nothing push fs:[0] pop seh.PrevLink mov seh.CurrentHandler,offset SEHHandler mov seh.SafeOffset,offset _FinalExit lea eax,seh mov fs:[0], eax mov seh.PrevEsp,esp mov seh.PrevEbp,ebp mov edi, pMapping assume edi:ptr IMAGE_DOS_HEADER .if [edi].e_magic==IMAGE_DOS_SIGNATURE add edi, [edi].e_lfanew assume edi:ptr IMAGE_NT_HEADERS .if [edi].Signature==IMAGE_NT_SIGNATURE mov ValidPE, TRUE .else mov ValidPE, FALSE .endif .else mov ValidPE,FALSE .endif _FinalExit: push seh.PrevLink pop fs:[0] .if ValidPE==TRUE invoke SectionPiti ;***************************** invoke EcrireDonnees, eax ;***************************** .if langage != 40Ch invoke MessageBox, 0, addr LoaderA, addr AppName, 40h .else invoke MessageBox, 0, addr Loader, addr AppName, 40h .endif .else invoke MessageBox,0, addr FileInValidPE, addr AppName,MB_OK+MB_ICONERROR .endif invoke UnmapViewOfFile, pMapping .else invoke MessageBox, 0, addr FileMappingError, addr AppName,MB_OK+MB_ICONERROR .endif invoke CloseHandle,hMapping .else invoke MessageBox, 0, addr FileOpenMappingError, addr AppName,MB_OK+MB_ICONERROR .endif invoke CloseHandle, hFile .else invoke MessageBox, 0, addr FileOpenError, addr AppName, MB_OK+MB_ICONERROR .endif .endif ret OuvrirFichier endp ;############################################ ON RAJOUTE LA SECTION PITI ################################################# SectionPiti proc uses esi edi mov edi, pMapping assume edi:ptr IMAGE_DOS_HEADER add edi, [edi].e_lfanew assume edi:ptr IMAGE_NT_HEADERS mov eax, [edi].OptionalHeader.ImageBase mov ImageBase, eax mov eax, [edi].OptionalHeader.AddressOfEntryPoint mov AddressOfEntryPoint, eax movzx eax, [edi].FileHeader.NumberOfSections mov NumberOfSections, eax inc NumberOfSections ; mov eax, NumberOfSections ; on rajoute une section mov [edi].FileHeader.NumberOfSections, ax ; mov eax, [edi].OptionalHeader.SectionAlignment ; 1000 mov SectionAlignment, eax ; mov eax, [edi].OptionalHeader.FileAlignment ; 200 mov FileAlignment, eax ; mov esi, edi assume esi:ptr IMAGE_NT_HEADERS ; esi représente la srtucture assume IMAGE_NT_HEADERS add edi, sizeof IMAGE_NT_HEADERS ; edi pointe sur la première table des section assume edi:ptr IMAGE_SECTION_HEADER ;push edi ; je le sauve parce que j'aurai de retour besoin qu'il repointe sur la première table des sections ;--------------------------------------------------------------- mov eax, NumberOfSections sub eax, 2 mov ebx, sizeof IMAGE_SECTION_HEADER mul ebx ; eax = taille de toutes les sections - Les 2 dernières add edi, eax ; edi pointe<sur le début de l'avant dernière section mov eax, [edi].VirtualAddress mov VirtualAddress, eax ; on récupère le VirtualAddress de la dernière section mov eax, [edi].Misc.VirtualSize mov VirtualSize, eax ; on récupère le VirtualSize de la dernière section mov eax, [edi].PointerToRawData mov PointerToRawData, eax ; on récupère le RawAddress de la dernière section mov eax, [edi].SizeOfRawData mov SizeOfRawData, eax ; on récupère le SizeOfRawData de la dernière section add edi, sizeof IMAGE_SECTION_HEADER mov eax, VirtualAddress ; mov ebx, VirtualSize ; add ebx, eax ; .while eax < ebx ; add eax, SectionAlignment ; .endw ; mov [edi].VirtualAddress, eax ; on definit le VirtualAddress de notre section mov VirtualAddress, eax mov eax, PointerToRawData ; mov ebx, SizeOfRawData ; add ebx, eax ; .while eax < ebx ; add eax, FileAlignment ; .endw ; mov [edi].PointerToRawData, eax ; on definit le PointerToRawData de notre section mov PointerToRawData, eax mov edx, 1000h ; taille_necessaire = tant que la taille nécessaire < eax alors xor eax, eax ; on augmente eax d'autant de fois FileAlignment .while eax < edx ; add eax, FileAlignment ; .endw ; mov [edi]. SizeOfRawData, eax ; mov SizeOfRawData, eax mov [edi].Misc.VirtualSize, eax ; On récupère la valeur de SizeOfImage du programme et je mov edx, [esi].OptionalHeader.SizeOfImage ; l'augmente d'autant que ma nouvelle section prend de place add edx, eax ; mov [esi].OptionalHeader.SizeOfImage, edx ; mov [edi].Characteristics, 0E0000060h ; On met cette nouvelle section en tant qu'accès en lecture et ecriture mov dword ptr [edi], "tip." ; mov word ptr [edi+4], "ti" ; On renomme cette section sous le nom .libre ;--------------------------------------------------------------- invoke UnmapViewOfFile, pMapping invoke CloseHandle,hMapping mov eax, PointerToRawData ; eax vaut add eax, SizeOfRawData ; maintenant le nb de byte total du fichier = taille de fichier invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE,0, eax ,0 ; Nouvelle Taille du programme en entier mov hMapping, eax invoke MapViewOfFile,hMapping,FILE_MAP_WRITE,0,0,0 mov pMapping, eax push edi invoke RVAToOffset, pMapping, [edi].VirtualAddress ; On transforme ce RVA en adresse mémoire (dans le fichier mappé) add eax, pMapping ; eax pointe sur l'adresse en mémoire où commence notre nouvelle section mov edx, SizeOfRawData ; .while edx > 0 ; Et on remplit en mémoire notre nouvelle section .idata de bytes NULLs mov byte ptr [eax+edx-1], 00h ; Car si on ne la définit pas, elle ne sera pas modifiée une fois qu'on dec edx ; .endw pop edi invoke RVAToOffset,pMapping, [edi].VirtualAddress add eax,pMapping mov ebx, eax mov edi, pMapping assume edi:ptr IMAGE_DOS_HEADER add edi, [edi].e_lfanew assume edi:ptr IMAGE_NT_HEADERS mov eax, VirtualAddress ; Redirection de l'EntryPoint sur mov [edi].OptionalHeader.AddressOfEntryPoint, eax ; le début de la section .pitit mov eax, ebx ret SectionPiti endp ;######################################################################################################################### ;################################################ ECRIRE LE LOADER ####################################################### ; ; Cette procédure écrit un loader à l'intérieur du programme cible. Quand la cible sera lancée, ce loader ; sera le premier exécuté. Il aura pour mission de retrouver les adresses des fonctions LoadLibrary ; et GetProcAdress puis d'écrire les noms des fonctions et DLL que vous aurez peut-être placées dans le ; fichier AddFunc.ini puis il retrouvera les adresses de chacune de ses nouvelles fonctions ; EcrireDonnees proc uses esi edi debutEcriture:DWORD LOCAL debutSection :DWORD LOCAL DLLnum :DWORD LOCAL FUNCnum :DWORD LOCAL NomFichier[100] :BYTE ;------------ jmp data@1 DLL db "DLL", 0 DLLD db "DLLD",0 F db "F",0 NFichier db "\AddFunc.ini",0 data@1: ;------------ invoke lstrcpy, addr NomFichier, addr CheminFichier invoke lstrcat, addr NomFichier, addr NFichier NOP mov edi, debutEcriture ; mov byte ptr [edi], 068h ; inc edi ; push ADDRESSE_DE_D2BUT_DE_LA_SECTION mov eax, ImageBase ; add eax, VirtualAddress ; mov debutSection, eax ; debutSection est le point de référence de la nouvelle section mov dword ptr [edi], eax ; ex: add edi, 4h ; 6800504000 PUSH 00405000 mov byte ptr [edi], 05Fh ; 5F POP EDI inc edi ; mov dword ptr [edi], 0000141E9h ; JMP EIP+141 donc ici CODE commence en 00404901 add edi, 4 ; mov byte ptr [edi], 00h ; inc edi ; ; ******* LES DATA ******* mov dword ptr [edi], 06E72654Bh ; add edi, 4 ; Kernel32.dll mov dword ptr [edi], 032336C65h ; add edi, 4 ; mov dword ptr [edi], 06C6C642Eh ; add edi, 4 ; mov byte ptr [edi], 00 ; (Null de terminaison) inc edi ; mov dword ptr [edi], 064616F4Ch ; add edi, 4 ; LoadLibraryA mov dword ptr [edi], 07262694Ch ; add edi, 4 ; mov dword ptr [edi], 041797261h ; add edi, 4 ; mov dword ptr [edi], 074654700h ; (Null de terminaison) add edi, 4 ; mov dword ptr [edi], 0636F7250h ; add edi, 4 ; GetProcAddress mov dword ptr [edi], 072646441h ; add edi, 4 ; mov dword ptr [edi], 000737365h ; (Null de terminaison) add edi, 4 ; mov dword ptr [edi], 04D746547h ; add edi, 4 ; mov dword ptr [edi], 06C75646Fh ; add edi, 4 ; mov dword ptr [edi], 06E614865h ; add edi, 4 ; mov dword ptr [edi], 041656C64h ; add edi, 4 ; mov byte ptr [edi], 0 ; (Null de terminaison) ;-------- mov edi, debutEcriture ;<-- debut de la nouvelle section dans le programme cible add edi, 060h ; ********************************************* PARTIE CODE ******************************************************** mov byte ptr [edi], 055h ; PUSH EBP inc edi ; ;*************************; mov word ptr [edi], 0EC8Bh ; MOV EBP, ESP ; Procédure GetKernelBase ; add edi, 2 ; ;*************************; mov byte ptr [edi], 056h ; PUSH ESI mov byte ptr [edi+1], 057h ; PUSH EDI mov dword ptr [edi+2], 081087D8Bh ; MOV EDI, DWORD PTR [EBP+08] mov byte ptr [edi+6], 0E7h ; mov dword ptr [edi+7], 0FFFF0000h ; AND EDI, 0000FFFFh mov byte ptr [edi+11], 066h ; mov dword ptr [edi+12], 05A4D3F81h ; CMP WORD PTR [EDI], 5A4D mov word ptr [edi+16], 00E75h ; JNE QUIT (saut vers QUIT) mov word ptr [edi+18], 0F78Bh ; MOV ESI, EDI mov byte ptr [edi+20], 03h ; mov word ptr [edi+21], 03C76h ; ADD ESI, DWORD PTR [ESI+3C] mov byte ptr [edi+23], 066h ; mov dword ptr [edi+24], 045503E81h ; CMP DWORD PTR [ESI], 4550 mov word ptr [edi+28], 00275h ; JNE QUIT (saut vers QUIT) mov word ptr [edi+30], 017EBh ; JMP 00401153 mov word ptr [edi+32], 0EF81h ; (QUIT:) mov dword ptr [edi+34], 00010000h ; SUB EDI, 00010000 mov word ptr [edi+38], 0FF81h ; mov dword ptr [edi+40], 070000000h ; CMP EDI, 70000000 mov word ptr [edi+44], 0772h ; JB 00401151 mov byte ptr [edi+46], 0BFh ; mov dword ptr [edi+47], 0BFF70000h ; MOV EDI, BFF70000 mov word ptr [edi+51], 02EBh ; JMP 00401153 mov word ptr [edi+53], 0D4EBh ; JMP 00401127 mov byte ptr [edi+55], 097h ; XCHG EAX, EDI mov byte ptr [edi+56], 05Fh ; POP EDI mov byte ptr [edi+57], 05Eh ; POP ESI mov dword ptr [edi+58], 0004C2C9h ; LEAVE & RET 0004 add edi, 62 ; mov dword ptr [edi], 090909090h ; NOP NOP NOP NOP ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mov byte ptr [edi+4], 055h ; PUSH EBP ;**************************; mov word ptr [edi+5], 0EC8Bh ; MOV EBP, ESP ; Procédure GetProcAddress ; mov dword ptr [edi+7], 053515756h ; PUSH ESI, EDI, ECX, EBX ;**************************; mov dword ptr [edi+11], 008758B52h ; PUSH EDX MOV ESI, DWORD PTR [EBP+08] mov byte ptr [edi+15], 066h ; mov dword ptr [edi+16], 05A4D3E81h ; CMP WORD PTR [ESI], 5A4D mov word ptr [edi+20], 0850Fh ; mov dword ptr [edi+22], 00000082h ; JNE 004011F2 mov byte ptr [edi+26], 03h ; mov word ptr [edi+27], 03C76h ; ADD ESI, DWORD PTR [ESI+3C] mov word ptr [edi+29], 03E81h ; mov dword ptr [edi+31], 00004550h ; CMP DWORD PTR [ESI], 00004550 mov word ptr [edi+35], 07775h ; JNE 004011F2 mov dword ptr [edi+37], 0B90C7D8Bh ; MOV EDI, DWORD PTR [EBP+0C] mov dword ptr [edi+41], 00000096h ; MOV ECX, 00000096 mov word ptr [edi+45], 0C032h ; XOR AL, AL mov word ptr [edi+47], 0AEF2h ; REPNZ & SCASB mov word ptr [edi+49], 0CF8Bh ; mov ecx, edi mov dword ptr [edi+51], 08B0C4D2Bh ; sub ecx, dword ptr [ebp+0C] mov dword ptr [edi+55], 055037856h ; mov edx, dword ptr [esi+78] mov dword ptr [edi+59], 0205A8B08h ; add edx, dword ptr [ebp+08] mov byte ptr [edi+63], 03h ; mov ebx, dword ptr [edx+20] mov word ptr [edi+64], 085Dh ; add ebx, dword ptr [ebp+08] mov word ptr [edi+66], 0C033h ; xor eax, eax mov word ptr [edi+68], 03B8Bh ; mov edi, dword ptr [ebx] mov word ptr [edi+70], 07D03h ; add edi, dword ptr [ebp+08] mov dword ptr [edi+72], 0C758B08h ; mov esi, dword ptr [ebp+0C] mov word ptr [edi+76], 0F351h ; push ecx & repz mov dword ptr [edi+78], 00F983A6h ; cmpsb & cmp ecx, 00000000 mov word ptr [edi+82], 0575h ; jne 004011AF mov byte ptr [edi+84], 83h ; mov word ptr [edi+85], 04C4h ; add esp, 00000004 mov word ptr [edi+87], 0AEBh ; jmp 004011B9 mov byte ptr [edi+89], 059h ; pop ecx mov dword ptr [edi+90], 04004C383h ; add ebx, 00000004 & inc eax mov dword ptr [edi+94], 07518423Bh ; cmp eax, dword ptr [edx+18] mov dword ptr [edi+98], 018423BE1h ; jne 0040119A & cmp eax, dword ptr [edx+18] mov word ptr [edi+102], 0275h ; jne 004011C0 mov word ptr [edi+104], 032EBh ; jmp 004011F2 mov dword ptr [edi+106], 0324728Bh ; mov esi, dword ptr [edx+24] mov word ptr [edi+110], 0875h ; add esi, dword ptr [ebp+08] mov word ptr [edi+112], 0BB52h ; push edx mov dword ptr [edi+114], 00000002h ; mov ebx, 00000002 mov word ptr [edi+118], 0D233h ; xor edx, edx mov word ptr [edi+120], 0E3F7h ; mul ebx mov byte ptr [edi+122], 05Ah ; pop edx mov word ptr [edi+123], 0C603h ; add eax, esi mov word ptr [edi+125], 0C933h ; xor ecx, ecx mov byte ptr [edi+127], 066h ; mov word ptr [edi+128], 088Bh ; mov cx, word ptr [eax] mov byte ptr [edi+130], 08Bh ; mov word ptr [edi+131], 01C7Ah ; mov edi, dword ptr [edx+1C] mov word ptr [edi+133], 0D233h ; xor edx, edx mov byte ptr [edi+135], 0BBh ; mov dword ptr [edi+136], 00000004h ; mov ebx, 00000004 mov word ptr [edi+140], 0C18Bh ; mov eax, ecx mov word ptr [edi+142], 0E3F7h ; mul ebx mov byte ptr [edi+144], 03h ; mov word ptr [edi+145], 0845h ; add eax, dword ptr [ebp+08] mov word ptr [edi+147], 0C703h ; add eax, edi mov word ptr [edi+149], 008Bh ; mov eax, dword ptr [eax] mov byte ptr [edi+151], 03h ; mov word ptr [edi+152], 0845h ; add eax, dword ptr [ebp+08] mov word ptr [edi+154], 02EBh ; jmp 004011F4 mov word ptr [edi+156], 0C033h ; xor eax, eax mov byte ptr [edi+158], 05Ah ; pop edx mov dword ptr [edi+159], 05E5F595Bh ; pop ebx & pop ecx & pop edi & pop esi mov dword ptr [edi+163], 0008C2C9h ; leave & ret 0008 mov dword ptr [edi+167], 090909090h ; NOP NOP NOP NOP add edi, 171 ;************************************************************** Fin des Procédures ************************************** mov word ptr [edi], 0C78Bh ; MOV EAX, EDI (edi = début de la section .pitit mov byte ptr [edi+2], 05h mov dword ptr [edi+3], 000000060h ; ADD EAX, 60h mov word ptr [edi+7], 0D0FFh ; CALL EAX (avec eax qui pointe sur la Procédure GetKernelBase) en retour eax = handle Kernel32.dll mov word ptr [edi+9], 0DF8Bh ; MOV EBX, EDI mov word ptr [edi+11], 8350h ; PUSH EAX mov word ptr [edi+13], 018C3h ; ADD EBX, 18h mov word ptr [edi+15], 05053h ; PUSH EBX & PUSH EAX mov word ptr [edi+17], 0C78Bh ; MOV EAX, EDI mov byte ptr [edi+19], 05 ; mov dword ptr [edi+20], 000000A5h ; ADD EAX, 0A5h mov word ptr [edi+24], 0D0FFh ; CALL EAX (avec eax qui pointe sur la procédure GetProcAddress) en retour eax = adresse LoadLibraryA mov word ptr [edi+26], 0DF8Bh ; MOV EBX, EDI mov byte ptr [edi+28], 083h ; mov word ptr [edi+29], 045C3h ; ADD EBX, 45h mov word ptr [edi+31], 00389h ; MOV DWORD PTR [EBX], EAX (inscription de l'adresse de LoadLibraryA) mov byte ptr [edi+33], 058h ; POP EAX mov byte ptr [edi+34], 050h ; PUSH EAX mov word ptr [edi+35], 0DF8Bh ; MOV EBX, EDI mov byte ptr [edi+37], 083h ; mov word ptr [edi+38], 025C3h ; ADD EBX, 25h mov word ptr [edi+40], 05053h ; PUSH EBX & PUSH EAX mov word ptr [edi+42], 0C78Bh ; MOV EAX, EDI mov byte ptr [edi+44], 05 ; mov dword ptr [edi+45], 0000000A5h ; ADD EAX, 0A5h mov word ptr [edi+49], 0D0FFh ; CALL EAX (avec eax qui pointe sur la procédure GetProcAddress) en retour eax = adresse GetProcAddress mov word ptr [edi+51], 0DF8Bh ; MOV EBX, EDI mov byte ptr [edi+53], 083h ; mov word ptr [edi+54], 049C3h ; ADD EBX, 49h mov word ptr [edi+56], 00389h ; MOV DWORD PTR [EBX], EAX mov byte ptr [edi+58], 058h ; POP EAX mov word ptr [edi+59], 0DF8Bh ; MOV EBX, EDI mov byte ptr [edi+61], 083h ; mov word ptr [edi+62], 034C3h ; ADD EBX, 34h mov word ptr [edi+64], 05053h ; PUSH EBX & PUSH EAX mov word ptr [edi+66], 0C78Bh ; MOV EAX, EDI mov byte ptr [edi+68], 05 ; mov dword ptr [edi+69], 0000000A5h ; ADD EAX, 0A5h mov word ptr [edi+73], 0D0FFh ; CALL EAX (avec eax qui pointe sur la procédure GetProcAddress) en retour eax = adresse GetModileHandleA mov word ptr [edi+75], 0DF8Bh ; MOV EBX, EDI mov byte ptr [edi+77], 083h ; mov word ptr [edi+78], 04DC3h ; ADD EBX, 4Dh mov word ptr [edi+80], 00389h ; MOV DWORD PTR [EBX], EAX add edi, 82 ;____________________________ 0-82d+31d+100h push edi mov esi, edi add esi, 0A7h ; A7h bytes plus loin = soit 200h bytes après l'inscription du dword de LoadLibraryA mov edi, esi mov DLLnum, 0 LesDLL: inc DLLnum invoke Deci2Char, DLLnum invoke lstrcpy, addr Buffer, addr DLL invoke lstrcat, addr Buffer, addr nombreHChar invoke GetPrivateProfileString, addr DLL, addr Buffer, addr erreur, addr BufferDLL, sizeof BufferDLL, addr NomFichier cmp dword ptr [BufferDLL], ">--<" je saute1 ;---------------------- invoke lstrlen, offset DLLD inc eax mov ecx, eax ; ecx = nb de caractères à recopier ;mov edi, esi ; edi = adresse où sera recopier la chaine de caractères mov esi, offset DLLD ; esi = pointe sur la chaine à recopier rep movsb invoke lstrlen, offset BufferDLL inc eax mov ecx, eax ; ecx = nb de caractères à recopier ;mov edi, esi ; edi = adresse où sera recopier la chaine de caractères mov esi, offset BufferDLL ; esi = pointe sur la chaine à recopier rep movsb ;---------------------- saute1: mov FUNCnum, 0 LesFonc: inc FUNCnum invoke Deci2Char, FUNCnum invoke lstrcpy, addr Buffer, addr F invoke lstrcat, addr Buffer, addr nombreHChar invoke GetPrivateProfileString, addr BufferDLL, addr Buffer, addr erreur, addr BufferFonction, sizeof BufferFonction, addr NomFichier cmp dword ptr [BufferFonction], ">--<" je saute2 ;---------------------- invoke lstrlen, offset BufferFonction inc eax mov ecx, eax ; ecx = nb de caractères à recopier ;mov edi, esi ; edi = adresse où sera recopier la chaine de caractères mov esi, offset BufferFonction ; esi = pointe sur la chaine à recopier rep movsb add edi, 4 ;invoke MessageBox, 0, addr BufferFonction, addr BufferDLL, 0 ;---------------------- saute2: cmp dword ptr [BufferFonction], ">--<" jne LesFonc cmp dword ptr [BufferDLL], ">--<" jne LesDLL ;----------- pop edi mov word ptr [edi], 09090h ; NOP & NOP mov esi, debutSection add esi, 0245h mov byte ptr [edi+2], 068h ; PUSH... mov dword ptr [edi+3], esi ; ... ADRESSE mov byte ptr [edi+7], 05Bh ; POP ebx mov word ptr [edi+8], 0C38Bh ; mov eax, ebx mov word ptr [edi+10], 03881h mov dword ptr [edi+12], 0444C4C44h ; cmp dword ptr [eax], 444C4C44 mov word ptr [edi+16], 01D75h ; jne 0040102E mov byte ptr [edi+18], 083h mov word ptr [edi+19], 005C0h ; add eax, 00000005 mov word ptr [edi+21], 0D88Bh ; mov ebx, eax mov byte ptr [edi+23], 043h ; inc ebx mov byte ptr [edi+24], 080h mov word ptr [edi+25], 0003Bh ; cmp byte ptr [ebx], 00 mov word ptr [edi+27], 0FA75h ; jne 00401016 mov word ptr [edi+29], 05043h ; inc ebx & push eax mov esi, debutSection add esi, 045h ; esi pointe sur l'adresse de LoadLibrary mov byte ptr [edi+31], 0BEh ; MOV ESI,.... mov dword ptr [edi+32], esi ; ... ADRESSE mov word ptr [edi+36], 016FFh ; CALL DWORD PTR [ESI] = Call _LoadLibraryA mov byte ptr [edi+38], 083h mov word ptr [edi+39], 000F8h ; cmp eax, 00000000 mov word ptr [edi+41], 02274h ; je 0040104A mov word ptr [edi+43], 0C88Bh ; mov ecx, eax mov word ptr [edi+45], 0D9EBh ; jmp 00401007 mov word ptr [edi+47], 08043h ; inc ebx mov word ptr [edi+49], 0003Bh ; cmp byte ptr [ebx], 00 mov word ptr [edi+51], 0FA75h ; jne 0040102E mov word ptr [edi+53], 05143h ; inc ebx & push ecx mov word ptr [edi+55], 05150h ; push eax & push ecx mov esi, debutSection add esi, 049h ; esi pointe sur l'adresse de GetProcAddress mov byte ptr [edi+57], 0BEh ; MOV ESI,.... mov dword ptr [edi+58], esi ; ... ADRESSE mov word ptr [edi+62], 016FFh ; CALL DWORD PTR [ESI] = Call _GetProcAddress mov byte ptr [edi+64], 083h mov word ptr [edi+65], 000F8h ; cmp eax, 00000000 mov word ptr [edi+67], 00874h ; je 0040104A mov byte ptr [edi+69], 059h ; pop ecx mov word ptr [edi+70], 00389h ; mov dword ptr [ebx], eax mov byte ptr [edi+72], 083h mov word ptr [edi+73], 004C3h ; add ebx, 00000004 mov word ptr [edi+75], 0BBEBh ; jmp 00401007 add edi, 77 ;____________________________ mov byte ptr [edi], 0B8h ; mov eax, ... mov eax, ImageBase ; add eax, AddressOfEntryPoint ; inc edi ; mov dword ptr [edi], eax ; ...EntryPoint mov word ptr [edi+4], 0E0FFh ; jmp eax ret EcrireDonnees endp ;######################################################################################################################### ;############################################## Fonction AddFunc.ini ##################################################### FichierAddFunc proc near LOCAL NomFichier[100] :BYTE jmp data2@ AFichier db "AddFunc.ini",0 Contenu1 db "DLL",0 Contenu2 db "DLL1",0 Contenu22 db "Nom_de_la_DLL_1.dll",0 Contenu3 db "DLL2",0 Contenu32 db "Nom_de_la_DLL_2.dll",0 Contenu4 db "DLLn",0 Contenu42 db "......",0 Contenu7 db "F1",0 Contenu72 db "Nom_de_la_Fonction1",0 Contenu8 db "F2",0 Contenu9 db "F3",0 open db "open",0 data2@: invoke lstrcpy, addr NomFichier, addr CheminFichier invoke lstrcat, addr NomFichier, addr NFichier invoke DeleteFile, addr NomFichier invoke WritePrivateProfileString, addr Contenu1, addr Contenu2, addr Contenu22, addr NomFichier invoke WritePrivateProfileString, addr Contenu1, addr Contenu3, addr Contenu32, addr NomFichier invoke WritePrivateProfileString, addr Contenu1, addr Contenu4, addr Contenu42, addr NomFichier invoke WritePrivateProfileString, addr Contenu22, addr Contenu7, addr Contenu72, addr NomFichier invoke WritePrivateProfileString, addr Contenu22, addr Contenu8, addr Contenu42, addr NomFichier invoke WritePrivateProfileString, addr Contenu32, addr Contenu7, addr Contenu72, addr NomFichier invoke WritePrivateProfileString, addr Contenu32, addr Contenu8, addr Contenu42, addr NomFichier invoke WritePrivateProfileString, addr Contenu32, addr Contenu9, addr Contenu42, addr NomFichier invoke ShellExecute, 0, addr open, addr NomFichier, NULL, NULL, SW_SHOWNORMAL ret FichierAddFunc endp ;######################################################################################################################### DlgProc2 PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM LOCAL rect:RECT .if iMsg==WM_INITDIALOG invoke GetDlgItem,hWnd,IDC_EDIT mov hEdit, eax invoke SetFocus,hEdit invoke SetWindowText, hEdit, addr etoile .elseif iMsg==WM_COMMAND mov eax,wParam mov edx,eax shr edx,16 .if dx==BN_CLICKED .if eax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL .elseif eax==IDC_BUTTON invoke CreateWindowEx,NULL,ADDR ProgressClass,NULL, WS_CHILD+WS_VISIBLE, 4, 6, 290, 22,hWnd,IDC_PROGRESS, hInstance,NULL mov hwndProgress,eax mov eax,100 ; Le paramètre lParam du message PBM_SETRANGE contient la gamme, (en général de 0 à 100) shl eax,16 ; La borne haute de la gamme (ici 100) est dans le mot de poids fort invoke SendMessage,hwndProgress,PBM_SETRANGE,0,eax invoke SendMessage,hwndProgress,PBM_SETPOS,0,0 invoke GetWindowText, hEdit, addr BufferFonction, 50 invoke lcase, addr BufferFonction invoke SendMessage,HWNDParent,WM_COMMAND, IDM_RCHLISTVIEW2, NULL invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL .elseif eax == IDC_DLL call NouvelleDLL .endif .endif .elseif iMsg==WM_MOVE invoke GetWindowRect, hwndDlg2, addr rect mov ecx, rect.right ; ecx = sub ecx, rect.left ; Largeur de la fenêtre ListView push ecx mov ebx, rect.bottom ; ebx = sub ebx, rect.top ; Hauteur de la fenêtre ListView invoke GetWindowRect, HWNDParent, addr rect pop ecx invoke MoveWindow, hwndDlg2, rect.left,rect.bottom,ecx, ebx, TRUE .elseif iMsg==WM_CLOSE invoke EndDialog,hwndDlg2,NULL mov hwndDlg2,0 .else mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc2 endp NouvelleDLL proc uses esi edi LOCAL NomModule[200] :BYTE LOCAL numDLL :DWORD LOCAL NomFichierDLL[200]:BYTE jmp data@9 FilterStringDLL db "Dynamic Link Library (*.dll)",0,"*.dll",0 db "All Files",0,"*.*",0,0 titreOpenDLL db "Ajouter une DLL à la liste de recherche",0 titreOpenDLLA db "Add a DLL to the list",0 fichierDLL db "\_suppldll.ini",0 data@9: invoke lstrcpy, addr NomFichierDLL, addr CheminFichier invoke lstrcat, addr NomFichierDLL, addr fichierDLL mov ofnDLL.lStructSize,SIZEOF ofnDLL mov ofnDLL.lpstrFilter, OFFSET FilterStringDLL lea eax, NomModule mov ofnDLL.lpstrFile, eax .if langage != 40Ch mov ofnDLL.lpstrTitle, OFFSET titreOpenDLLA .else mov ofnDLL.lpstrTitle, OFFSET titreOpenDLL .endif mov ofnDLL.nMaxFile,512 mov ofnDLL.Flags, OFN_FILEMUSTEXIST or \ OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ OFN_EXPLORER or OFN_HIDEREADONLY invoke GetOpenFileName, ADDR ofnDLL .if eax==TRUE xor ebx, ebx xor edx, edx retourr: lea ecx, NomModule mov al, byte ptr [ecx+edx] mov byte ptr [NomM+ebx], al inc ebx inc edx cmp al, "\" jne rien xor ebx, ebx rien: cmp al, 0 jne retourr mov numDLL, 0 retourDLL_: inc numDLL invoke Deci2Char, numDLL invoke lstrcpy, addr Buffer, addr DLL invoke lstrcat, addr Buffer, addr nombreHChar invoke GetPrivateProfileString, addr DLL, addr Buffer, addr erreur, addr BufferDLL, sizeof BufferDLL, addr NomFichierDLL invoke lstrcmpi, addr BufferDLL, addr NomM cmp eax, 0 je DllExisteDeja cmp dword ptr [BufferDLL], ">--<" jne retourDLL_ invoke WritePrivateProfileString, addr DLL, addr Buffer, addr NomM, addr NomFichierDLL invoke WritePrivateProfileString, addr Buffer, addr NomM, addr NomModule, addr NomFichierDLL .endif DllExisteDeja: ret NouvelleDLL endp lcase proc text:DWORD ; ----------------------------- ; converts string to lower case ; invoke lcase,ADDR szString ; ----------------------------- push esi push edi mov esi, text mov edi, text cld lcSt: lodsb cmp al, 0 ; exit on zero terminator je lcOut cmp al, "A" jl @F cmp al, "Z" jg @F add al, 32 @@: stosb jmp lcSt lcOut: stosb pop edi pop esi ret lcase endp include modules\ListView.inc include modules\ListViewRech.inc end start